/** 判断是否是一个纯对象 */
export function isPlainObject(obj: any): boolean {
    return obj != null && typeof obj === "object" && !Array.isArray(obj) && Object.prototype.toString.call(obj) === "[object Object]";
}

/** 获取对象中所有嵌套的key键，并将它们用点号分割组成字符串 */
export function getObjectKeys(obj: any): Set<string> {
    if (!isPlainObject(obj)) return new Set<string>(); // 如果不是纯对象，返回空集合

    const stack = [{ _obj: obj, key: "" }];
    const keys = new Set<string>();

    while (stack.length > 0) {
        const { _obj, key } = stack.pop()!; // 使用非空断言，因为 stack.length > 0
        for (const k in _obj) {
            const newKey = key ? `${key}.${k}` : k;
            isPlainObject(_obj[k]) ? stack.push({ _obj: _obj[k], key: newKey }) : keys.add(newKey);
        }
    }

    return keys;
}
